package com.example.library.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.library.entity.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 图书Mapper接口
 */
@Mapper
public interface BookMapper extends BaseMapper<Book> {

    /**
     * 根据ISBN查询图书
     *
     * @param isbn ISBN号
     * @return 图书信息
     */
    @Select("SELECT b.*, c.name as category_name FROM books b " +
            "LEFT JOIN categories c ON b.category_id = c.id " +
            "WHERE b.isbn = #{isbn} AND b.deleted = 0")
    Book findByIsbn(@Param("isbn") String isbn);

    /**
     * 分页查询图书列表（带分类名称）
     *
     * @param page       分页参数
     * @param title      书名（模糊查询）
     * @param author     作者（模糊查询）
     * @param isbn       ISBN（模糊查询）
     * @param categoryId 分类ID
     * @param status     状态
     * @return 图书分页列表
     */
    IPage<Book> selectBookPage(Page<Book> page,
                               @Param("title") String title,
                               @Param("author") String author,
                               @Param("isbn") String isbn,
                               @Param("categoryId") Long categoryId,
                               @Param("status") Integer status);

    /**
     * 查询热门图书（按借阅次数排序）
     *
     * @param limit 限制数量
     * @return 热门图书列表
     */
    List<Book> selectPopularBooks(@Param("limit") Integer limit);

    /**
     * 查询最新图书
     *
     * @param limit 限制数量
     * @return 最新图书列表
     */
    @Select("SELECT b.*, c.name as category_name FROM books b " +
            "LEFT JOIN categories c ON b.category_id = c.id " +
            "WHERE b.deleted = 0 AND b.status = 1 " +
            "ORDER BY b.created_time DESC LIMIT #{limit}")
    List<Book> selectLatestBooks(@Param("limit") Integer limit);

    /**
     * 查询推荐图书（评分高的图书）
     *
     * @param limit 限制数量
     * @return 推荐图书列表
     */
    List<Book> selectRecommendedBooks(@Param("limit") Integer limit);

    /**
     * 根据分类查询图书
     *
     * @param categoryId 分类ID
     * @param limit      限制数量
     * @return 图书列表
     */
    @Select("SELECT b.*, c.name as category_name FROM books b " +
            "LEFT JOIN categories c ON b.category_id = c.id " +
            "WHERE b.category_id = #{categoryId} AND b.deleted = 0 AND b.status = 1 " +
            "ORDER BY b.created_time DESC LIMIT #{limit}")
    List<Book> selectBooksByCategory(@Param("categoryId") Long categoryId, @Param("limit") Integer limit);

    /**
     * 搜索图书（全文搜索）
     *
     * @param page    分页参数
     * @param keyword 关键词
     * @return 图书分页列表
     */
    IPage<Book> searchBooks(Page<Book> page, @Param("keyword") String keyword);

    /**
     * 更新图书可借数量
     *
     * @param bookId   图书ID
     * @param quantity 数量变化（正数增加，负数减少）
     * @return 更新结果
     */
    @Update("UPDATE books SET available_quantity = available_quantity + #{quantity} " +
            "WHERE id = #{bookId} AND deleted = 0")
    Integer updateAvailableQuantity(@Param("bookId") Long bookId, @Param("quantity") Integer quantity);

    /**
     * 统计图书数量
     *
     * @param categoryId 分类ID
     * @param status     状态
     * @return 图书数量
     */
    @Select("SELECT COUNT(*) FROM books WHERE deleted = 0 " +
            "AND (#{categoryId} IS NULL OR category_id = #{categoryId}) " +
            "AND (#{status} IS NULL OR status = #{status})")
    Long countBooks(@Param("categoryId") Long categoryId, @Param("status") Integer status);

    /**
     * 统计库存不足的图书数量
     *
     * @param threshold 库存阈值
     * @return 库存不足的图书数量
     */
    @Select("SELECT COUNT(*) FROM books WHERE deleted = 0 AND status = 1 " +
            "AND available_quantity <= #{threshold}")
    Long countLowStockBooks(@Param("threshold") Integer threshold);

    /**
     * 查询库存不足的图书列表
     *
     * @param threshold 库存阈值
     * @return 库存不足的图书列表
     */
    @Select("SELECT b.*, c.name as category_name FROM books b " +
            "LEFT JOIN categories c ON b.category_id = c.id " +
            "WHERE b.deleted = 0 AND b.status = 1 AND b.available_quantity <= #{threshold} " +
            "ORDER BY b.available_quantity ASC")
    List<Book> selectLowStockBooks(@Param("threshold") Integer threshold);

    /**
     * 批量更新图书状态
     *
     * @param bookIds 图书ID列表
     * @param status  状态
     * @return 更新数量
     */
    Integer batchUpdateStatus(@Param("bookIds") List<Long> bookIds, @Param("status") Integer status);

    /**
     * 统计图书总数量
     *
     * @return 图书总数量
     */
    @Select("SELECT COALESCE(SUM(total_quantity), 0) FROM books WHERE deleted = 0")
    Long sumTotalCount();

    /**
     * 统计可借图书数量
     *
     * @return 可借图书数量
     */
    @Select("SELECT COALESCE(SUM(available_quantity), 0) FROM books WHERE deleted = 0 AND status = 1")
    Long sumAvailableCount();

}